package admin

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"mojieshi/define"
	"mojieshi/models"
	"net/http"
	"strconv"
)

type Administrators struct {
	ID           int    `json:"id"`
	UserName     string `json:"user_name"`     //姓名
	UserPic      string `json:"user_pic"`      //头像
	Phone        string `json:"phone"`         //手机号
	Status       int    `json:"status"`        //状态值  0 禁用 1启用
	GroupId      int    `json:"group_id"`      //等级id
	GroupName    string `json:"group_name"`    //等级名称
	OperatorUid  int    `json:"operator_uid"`  //操做人id
	OperatorName string `json:"operator_name"` //操做人
	LoginAt      int    `json:"login_at"`
	CreatedAt    int    `json:"created_at"`
}

// 管理员list
func UserAdminList(c *gin.Context) {
	//接收传值
	var jsonData Newdata
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10000,
			"msg":  err,
		})
		return
	}
	//获取数据
	var adminData []Administrators
	var count int64
	if jsonData.Page == 0 {
		jsonData.Page = -1
	}
	if jsonData.Limit == 0 {
		jsonData.Limit = -1
	}
	//计算指定在开始返回记录之前要跳过的记录数量
	offsetVal := (jsonData.Page - 1) * jsonData.Limit
	if jsonData.Page == -1 || jsonData.Limit == -1 {
		offsetVal = -1
	}
	tx := models.DB.Table("m_admin_user").Select("m_admin_user.id,m_admin_user.user_name,m_admin_user.user_pic,m_admin_user.phone,m_admin_user.status,m_admin_group.name as group_name,m_admin_user.group_id,m_admin_user.login_at,m_admin_user.created_at,c.user_name as operator_name,m_admin_user.operator_uid").Joins("left join m_admin_group on m_admin_group.id=m_admin_user.group_id").Joins("left join m_admin_user c on c.id=m_admin_user.operator_uid").Where("m_admin_user.is_show=?", 1)
	if jsonData.Bid > 0 {
		tx = tx.Where("m_admin_user.bid=?", jsonData.Bid)
	}

	if jsonData.Id > 0 {
		tx = tx.Where("m_admin_user.id=?", jsonData.Id)
	}
	tx = tx.Count(&count).Limit(jsonData.Limit).Offset(offsetVal).Find(&adminData)
	if tx.Error != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10001,
			"msg":  tx.Error,
		})
		return
	}
	if len(adminData) == 0 {
		adminData = nil
	}
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"data": map[string]interface{}{
			"list":  adminData,
			"count": count,
		},
	})
}

type UserAdminEdit struct {
	ID          int    `json:"id"`
	Bid         int    `json:"bid"`          //商户ID
	UserName    string `json:"user_name"`    //姓名
	UserPic     string `json:"user_pic"`     //头像
	Password    string `json:"password"`     //密码
	Phone       string `json:"phone"`        //手机号
	Status      int    `json:"status"`       //状态值  0 禁用 1启用
	GroupId     int    `json:"group_id"`     //等级id
	IsShow      int    `json:"is_show"`      //0显示 1隐藏
	OperatorUid int    `json:"operator_uid"` //操做人
}

// 管理员add/edit
func UserAdminAdd(c *gin.Context) {
	//获取传值
	var jsonData UserAdminEdit
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10000,
			"msg":  err,
		})
		return
	}
	var data models.MAdminUser
	var count int64
	err = models.DB.Model(new(models.MAdminUser)).Where("phone=? AND bid=? AND id<>?", jsonData.Phone, jsonData.Bid, jsonData.ID).Count(&count).Find(&data).Error
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code": 10001,
			"msg":  err.Error(),
		})
		return
	}
	if count > 0 {
		c.JSON(http.StatusOK, gin.H{
			"code": 10002,
			"msg":  "手机号已被使用",
		})
		return
	}
	if jsonData.ID > 0 {
		//修改数据
		var editData = map[string]interface{}{
			"user_name": jsonData.UserName,
			"status":    jsonData.Status,
			"group_id":  jsonData.GroupId,
			"phone":     jsonData.Phone,
			"user_pic":  jsonData.UserPic,
		}
		if jsonData.Password != "" {
			editData["password"] = define.GetMD5(jsonData.Password)
		}
		err = models.DB.Model(new(models.MAdminUser)).Where("id=?", jsonData.ID).Updates(&editData).Error
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": 10003,
				"msg":  err.Error(),
			})
			return
		}
		//写入日志
		userName, bid := models.UserName(jsonData.OperatorUid)
		logData := "管理员：" + userName + ", 修改了管理员uid：" + strconv.Itoa(jsonData.ID) + "的资料"
		models.LogAdd(3, "修改管理员", jsonData.OperatorUid, logData, bid, 38)
	} else {
		//写入数据
		var addData models.MAdminUser
		addData.Bid = jsonData.Bid
		addData.UserName = jsonData.UserName
		addData.UserPic = jsonData.UserPic
		addData.OperatorUid = jsonData.OperatorUid
		addData.Phone = jsonData.Phone
		addData.Password = define.GetMD5(jsonData.Password)
		addData.GroupId = jsonData.GroupId
		addData.Status = 1
		addData.IsShow = 1
		addData.Language = "zh"
		err = models.DB.Model(new(models.MAdminUser)).Create(&addData).Error
		if err != nil {
			c.JSON(http.StatusOK, gin.H{
				"code": 10004,
				"msg":  err.Error(),
			})
			return
		}
		//写入日志
		userName, bid := models.UserName(jsonData.OperatorUid)
		logData := "管理员：" + userName + "，新增了一位管理员:" + jsonData.UserName
		models.LogAdd(2, "新增管理员", jsonData.OperatorUid, logData, bid, 38)
	}
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"msg":     "成功！",
	})
}

// 删除管理员
func UserAdminDel(c *gin.Context) {
	//获取管理员id
	var jsonData models.MAdminUser
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		define.Response.ResultFail(c, 10000, define.JsonData, "")
		return
	}
	var data models.MAdminUser
	var count int64
	err = models.DB.Model(new(models.MAdminUser)).Where("id=?", jsonData.ID).Count(&count).First(&data).Error
	if err != nil {
		define.Response.ResultFail(c, 10001, err.Error(), "")
		return
	}
	if count < 1 {
		define.Response.ResultFail(c, 10002, "没有该用户", "")
		return
	}
	//删除
	err = models.DB.Delete(&models.MAdminUser{}, jsonData.ID).Error
	if err != nil {
		define.Response.ResultFail(c, 10003, err.Error(), "")
		return
	}
	//写入日志
	userId, err := strconv.Atoi(c.GetHeader("userId")) //将字符串转为int
	userName, bid := models.UserName(userId)
	logData := "管理员：" + userName + "，删除了一个管理员:" + data.UserName
	models.LogAdd(4, "删除管理员", userId, logData, bid, jsonData.Aid)
	//返回成功
	define.Response.ResultSuccess(c, "删除成功！", nil)
}

type adminRole struct {
	ID     int    `json:"id"`
	MenuId int    `json:"menu_id"`
	RoleId int    `json:"role_id"`
	Type   int    `json:"type"` //菜单类型 1:目录 2菜单
	Path   string `json:"path"` //菜单路径--标识
}

// 获取管理的详情
func UserInfo(c *gin.Context) {
	//从请求头获取userid,并将字符串转为int
	var userId, err = strconv.Atoi(c.GetHeader("userId"))
	if err != nil {
		define.Response.ResultFail(c, 10000, define.JsonData, "")
		return
	}
	var userInfo models.MAdminUser
	//查询管理员
	err = models.DB.Model(new(models.MAdminUser)).Where("id=?", userId).First(&userInfo).Error
	if err != nil {
		define.Response.ResultFail(c, 10001, err.Error(), "")
		return
	}
	//查询用户权限
	var listAdmin []adminRole
	var count int64
	Select := "m_rolt.id,m_rolt.menu_id,m_rolt.role_id,m_menu.type,m_menu.path"
	err = models.DB.Table("m_rolt").Select(Select).Joins("left join m_menu on m_rolt.menu_id=m_menu.id").Where("m_rolt.role_id=?", userInfo.GroupId).Count(&count).Find(&listAdmin).Error
	if err != nil {
		define.Response.ResultFail(c, 10002, err.Error(), "")
		return
	}
	fmt.Println(listAdmin)
	var menus []string
	var points []string
	for i := 0; i < len(listAdmin); i++ {
		if listAdmin[i].Type == 1 {
			menus = append(menus, listAdmin[i].Path)
		} else if listAdmin[i].Type == 2 {
			points = append(points, listAdmin[i].Path)
		}
	}
	define.Response.ResultSuccess(c, "", map[string]interface{}{
		"user_id":   userInfo.ID,
		"user_name": userInfo.UserName,
		"phone":     userInfo.Phone,
		"user_pic":  userInfo.UserPic,
		"language":  userInfo.Language,
		"bid":       userInfo.Bid,
		"menus":     menus,
		"points":    points,
	})
}

// 设置语言环境
type languageJson struct {
	Uid      int    `json:"uid"`
	Language string `json:"language"`
}

func SetLanguage(c *gin.Context) {
	var jsonData languageJson
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		define.Response.ResultFail(c, 10000, define.JsonData, "")
		return
	}
	var data = map[string]interface{}{
		"language": jsonData.Language,
	}
	err = models.DB.Model(new(models.MAdminUser)).Where("id=?", jsonData.Uid).Updates(&data).Error
	if err != nil {
		define.Response.ResultFail(c, 10001, err.Error(), "")
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"success": true,
		"code":    0,
		"msg":     "成功！",
	})
}
